package com.zimi.util;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class StrUtil {

    /**
     * 下划线转驼峰
     *
     * @param str 字符串
     * @param ch  分隔符
     * @return String
     */
    public static String camel(String str, char ch) {
        //利用正则删除下划线，把下划线后一位改成大写
        Pattern pattern = Pattern.compile(ch + "(\\w)");
        Matcher matcher = pattern.matcher(str);
        StringBuffer sb = new StringBuffer(str);
        if (matcher.find()) {
            sb = new StringBuffer();
            //将当前匹配子串替换为指定字符串，并且将替换后的子串以及其之前到上次匹配子串之后的字符串段添加到一个StringBuffer对象里。
            //正则之前的字符和被替换的字符
            matcher.appendReplacement(sb, matcher.group(1).toUpperCase());
            //把之后的也添加到StringBuffer对象里
            matcher.appendTail(sb);
        } else {
            return sb.toString();
        }
        return camel(sb.toString(), ch);
    }


    /**
     * 驼峰转下划线
     *
     * @param str 字符串
     * @param ch  分隔符
     * @return String
     */
    public static String underline(String str, char ch) {
        Pattern pattern = Pattern.compile("[A-Z]");
        Matcher matcher = pattern.matcher(first2low(str));//先把首字母转小写,防止转换后单词前出现符号
        StringBuffer sb = new StringBuffer(str);
        if (matcher.find()) {
            sb = new StringBuffer();
            //将当前匹配子串替换为指定字符串，并且将替换后的子串以及其之前到上次匹配子串之后的字符串段添加到一个StringBuffer对象里。
            //正则之前的字符和被替换的字符
            matcher.appendReplacement(sb, ch + matcher.group(0).toLowerCase());
            //把之后的也添加到StringBuffer对象里
            matcher.appendTail(sb);
        } else {
            return sb.toString();
        }
        return underline(sb.toString(), ch);
    }

    /**
     * 首字母转小写
     *
     * @param s 字符串
     * @return String
     */
    public static String first2low(String s) {
        if (Character.isLowerCase(s.charAt(0)))
            return s;
        else
            return String.valueOf(Character.toLowerCase(s.charAt(0))) + s.substring(1);
    }


    /**
     * 首字母转大写
     *
     * @param s 字符串
     * @return String
     */
    public static String first2up(String s) {
        if (Character.isUpperCase(s.charAt(0)))
            return s;
        else
            return String.valueOf(Character.toUpperCase(s.charAt(0))) + s.substring(1);
    }
}
